package com.yixun.qfbao.util;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class EnumsUtil {
	private static Logger logger= LoggerFactory.getLogger(EnumsUtil.class);
	/** 
	 * 枚举转map结合value作为map的key,description作为map的value 
	 * @param enumT 
	 * @param methodNames
	 * @return enum mapcolloction 
	 */  
	public static <T> Map<Object, String> EnumToMap(Class<T> enumT,  
	        String... methodNames) {  
	    Map<Object, String> enummap = new HashMap<Object, String>();  
	    if (!enumT.isEnum()) {  
	        return enummap;  
	    }  
	    T[] enums = enumT.getEnumConstants();  
	    if (enums == null || enums.length <= 0) {  
	        return enummap;  
	    }  
	    int count = methodNames.length;  
	    String valueMathod = "getNo"; //默认接口value方法  
	    String desMathod = "getDes";//默认接口description方法  
	    if (count >= 1 && !"".equals(methodNames[0])) { //扩展方法  
	        valueMathod = methodNames[0];  
	    }  
	    if (count == 2 && !"".equals(methodNames[1])) {  
	        desMathod = methodNames[1];  
	    }  
	    for (int i = 0, len = enums.length; i < len; i++) {  
	        T tobj = enums[i];  
	        try {  
	            Object resultValue = getMethodValue(valueMathod, tobj); //获取value值  
	            if ("".equals(resultValue)) {  
	                continue;  
	            }  
	            Object resultDes = getMethodValue(desMathod, tobj); //获取description描述值  
	            if ("".equals(resultDes)) { //如果描述不存在获取属性值  
	                resultDes = tobj;  
	            }  
	            enummap.put(resultValue, resultDes + "");  
	        } catch (Exception e) {  
	            logger.error("EnumToMap error: {}",e);
	        }  
	    }  
	    return enummap;  
	} 
	/** 
	 * 根据反射，通过方法名称获取方法值，忽略大小写的 
	 * @param methodName 
	 * @param obj 
	 * @param args 
	 * @return return value 
	 */  
	private static <T> Object getMethodValue(String methodName, T obj,  
	        Object... args) {  
	    Object resut = "";  
	    // boolean isHas = false;  
	    try {  
	        /********************************* start *****************************************/  
	        Method[] methods = obj.getClass().getMethods(); //获取方法数组，这里只要共有的方法  
	        if (methods.length <= 0) {  
	            return resut;  
	        }  
	        // String methodstr=Arrays.toString(obj.getClass().getMethods());  
	        // if(methodstr.indexOf(methodName)<0){ //只能粗略判断如果同时存在 getValue和getValues可能判断错误  
	        // return resut;  
	        // }  
	        // List<Method> methodNamelist=Arrays.asList(methods); //这样似乎还要循环取出名称  
	        Method method = null;  
	        for (int i = 0, len = methods.length; i < len; i++) {  
	            if (methods[i].getName().equalsIgnoreCase(methodName)) { //忽略大小写取方法  
	                // isHas = true;  
	                methodName = methods[i].getName(); //如果存在，则取出正确的方法名称  
	                method = methods[i];  
	                break;  
	            }  
	        }  
	        // if(!isHas){  
	        // return resut;  
	        // }  
	        /*************************** end ***********************************************/  
	        // Method method = obj.getClass().getDeclaredMethod(methodName); ///确定方法  
	        if (method == null) {  
	            return resut;  
	        }  
	        resut = method.invoke(obj, args); //方法执行  
	        if (resut == null) {  
	            resut = "";  
	        }  
	        return resut; //返回结果  
	    } catch (Exception e) {  
	        logger.error("getMethodValue error: {}",e);
	    }  
	    return resut;  
	}
	
	
	/** 
	 *  返回枚举类 getNo和getDesc 获取值的集合
	 * @param <T>
	 * @param enumT 
	 * @param method 
	 * @return enum mapcolloction 
	 */  
	public static <T> List<Map<String, Object>> EnumToList(Class<T> enumT) {  
	    List<Map<String, Object>> enummap = new ArrayList<>();  
	    if (!enumT.isEnum()) {
	        return enummap;
	    }
	    T[] enums = enumT.getEnumConstants();
	    if (enums == null || enums.length <= 0) {  
	        return enummap;  
	    }
	    String valueMathod = "getNo"; //默认接口value方法  
	    String desMathod = "getDes";//默认接口description方法  
	    List<Map<String, Object>> returnList = new ArrayList<>();
	    for (int i = 0, len = enums.length; i < len; i++) {
	    	T tobj = enums[i];  
		    Object resultValue = getMethodValue(valueMathod, tobj); //获取value值  
	        if ("".equals(resultValue)) {  
	            continue;  
	        }  
	        Object resultDes = getMethodValue(desMathod, tobj); //获取description描述值  
	        if ("".equals(resultDes)) { //如果描述不存在获取属性值  
	            resultDes = tobj;  
	        }
	        Map<String, Object> enumMap = new HashMap<>();
	        enumMap.put("no", resultValue);
	        enumMap.put("des", resultDes);
	        returnList.add(enumMap);
	    }
	    return returnList;
	} 
	
}
